package com.cyj.springbootservice.controller.aop;

import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

/**
 * @description: 声明一个切面，只用加一个@Aspect注解就可以了 还有个注解@Component是声明这个类为Spring的bean
 * @Author C_Y_J
 * @create 2021/11/25 18:56
 **/
@Aspect
@Component
public class AopAspect {
    /**
     * 切面的组成部分之一，告诉程序要对哪些方法进行操作
     * 在本DEMO中直接指定了一个方法，推荐后续用注解的方式去找方法
     * 在现在注解盛行的时代，这样根据方法名去找方法的用处已经不多了
     * 更多的是通过某个注解去找到对应的方法，后续也会有DEMOb出来
     */
    @Pointcut("execution(public * com.cyj.springbootservice.controller.aop.AopController.testAspect(..))")
    public void testPointcut() {
    }

    /**
     * 对找到的方法进行修改
     * 有@Around，对方法执行前后进行修改
     * 有@Before, 在方法执行前进行修改
     * 有@After,  在方法执行后进行修改
     * 有@AfterReturning， 在方法返回后进行修改
     * 有@AfterThrowing， 在方法抛出异常后修改
     * 常用的是@Around,常用于对方法体加 Try-catch，对方法执行计时，对方法入参，返回做日志记录等等
     */
//    @Around("testPointcut()")
//    public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
//        System.out.println("before pointcut");
//        Object proceed = joinPoint.proceed();
//        System.out.println("after pointcut");
//        return proceed;
//    }


    /**
     * 对找到的方法进行修改
     * 有@Around，对方法执行前后进行修改
     * 有@Before, 在方法执行前进行修改
     * 有@After,  在方法执行后进行修改
     * 有@AfterReturning， 在方法返回后进行修改
     * 有@AfterThrowing， 在方法抛出异常后修改
     * 常用的是@Around,常用于对方法体加 Try-catch，对方法执行计时，对方法入参，返回做日志记录等等
     */
    @AfterReturning("testPointcut()")
    public void doAfterReturning() {
        System.out.println("afterReturning joinPoint");
    }
}
